// 复合数据类型
package main

// import "fmt"

// func main() {
// 一. 数组
/*
	// 1. 定义 var 数组名 [数组长度]T
	var arr1 [3]int
	var arr2 [4]int

	fmt.Printf("%T, %T\n", arr1, arr2) // 数组的长度也是类型的一部分

	// 2. 初始化 默认0
	var arr3 [3]int
	arr3[0] = 10                  // 依次赋值
	var arr4 = [4]int{10, 20, 30} // 没赋值的默认为0
	fmt.Println(arr4)
	var arr6 = [...]int{1, 2, 3, 4, 5, 6, 7, 8} // 编译器自己推导 但仍旧不能扩展
	fmt.Println(arr6, len(arr6))
	var arr7 = [...]int{0: 1, 3: 2, 20: -1} // 用得很多
	fmt.Println(arr7, len(arr7))

	// 3. 遍历
	for idx, value := range arr4 {
		fmt.Println(idx, value)
	}

	// 值类型？还是引用类型
	// 值类型：基本数据类型 和 数组   改变副本不改变本身
	// 引用类型：切片   改变副本改变本身
*/

// 二. 切片  元素类型相同、可变长序列、
/**/
// 1. 声明
// var arr1 []int
// fmt.Printf("%v, %T, %d\n", arr1, arr1, len(arr1))

// var arr2 = []int{1, 2, 5, 10}
// fmt.Printf("%v, %T, %d\n", arr2, arr2, len(arr2))

// var arr3 = []int{1: 5, 4: 2, 5: 5, 10: -1}
// fmt.Printf("%v, %T, %d\n", arr3, arr3, len(arr3))
// // 复合数据类型不赋初值，则为nil
// fmt.Println(arr1 == nil)

// // 2. 遍历 和数组差不多
// a := [5]int{1, 2, 3, 4, 5}
// b := a[2:] // 这种方式和Python差不多, 没有负数, 没有步长.
// fmt.Printf("%v -- %T\n", a, a)
// fmt.Printf("%v -- %T\n", b, b)

// c := []string{"a", "b", "c", "d", "e", "f"}
// d := c[3:4]
// fmt.Printf("%v -- %T\n", d, d)

// 3. 长度 len 和 容量 cap
/*
	切片包含三个属性：指向底层数组的指针，长度，容量。
	实质上，切片是一个指向数组一部分的指针，长度不难理解。
	对于容量而言，是指当前切片首元素开始，到底层数组最后一个元素。总共有多少个元素。
	注意，是底层数组！！！
	这是切片的特性。
*/

// 电脑G了，以后拿手机开会，今天先到这吧，明天开始学习make。

// }
